/*
*    Author : heiden deng(dengjianquan@beyondcent.com)
*    2017/07/19
*    version 0.0.9
*    consumer接口函数工具类函数定义
*/


#include <string.h>
#include "htsc_grpc_common.h"
#include "htsc_grpc_common_utils.h"
#include "htsc_grpc_utils.h"
#include "htsc_grpc_conf.h"
#include "registry_contants.h"
#include "htsc_grpc_consumer_utils.h"
#include "htsc_grpc_properties_tools.h"
#include "url.h"
#include "htsc_grpc_consumer_control_deprecated.h"

//读取配置文件中的参数组织成url串。
//生成的url串格式为 aaa=xx&bbb=xxx&ccc=xxxx
int htsc_grpc_consumer_conf_param(char * urlparam, grpc_conf_template_t confitem[],int itemcount) {
	if (htsc_grpc_properties_init() < 0) {
		return -1;
	}
	//printf("\n -----config item: %d / %d = %d  \n" , sizeof(confitem), sizeof(confitem[0]),sizeof(confitem) / sizeof(confitem[0]));
	//int itemcount = sizeof(confitem) / sizeof(confitem[0]);
	char pconfitem[HTSC_GRPC_PROPERTY_VALUE_MAX_LEN];	
	int count = 0;
	for (int i = 0;i < itemcount;i++) {
		memset(pconfitem, 0, HTSC_GRPC_PROPERTY_VALUE_MAX_LEN);
		if (confitem[i].keyreg == "" || confitem[i].keyreg == NULL) {
			continue;
		} 
		strcat(urlparam,"&");		
		strcat(urlparam, confitem[i].keyreg);
		strcat(urlparam, "=");
		//读取配置文件
		if (confitem[i].key == "" || confitem[i].key == NULL) {
			strcat(urlparam, confitem[i].defaultvalue);
		}
		else {
			htsc_grpc_properties_get_value(confitem[i].key, NULL, pconfitem);
			if (pconfitem == NULL || strcmp(pconfitem, "") == 0) {  //取到值，设置为默认值
				strcat(urlparam, confitem[i].defaultvalue);
			}
			else {
				strcat(urlparam, pconfitem);
			}
		}		
	}
	//printf("\n -------- param : %s \n", urlparam);
	return 0;
}

//拼接url参数
void htsc_grpc_consumer_url_append(char *url, char * prefix,const  char *key, const char *val) {
	if (prefix != NULL) {
		strcat(url, prefix);
	}
	strcat(url, key);
	strcat(url, "=");
	strcat(url, val);
}

//定义consumer端配置文件模板,数据样例
//consumer://192.168.13.1/com.htsc.grpc.examples.helloworld.Greeter
//?application=grpc-test-app
//&category=consumers
//&check=true
//&default.cluster=failover
//&default.connections=0
//&default.loadbalance=round_robin
//&default.requests=10000
//&default.retries=2
//&default.timeout=1000
//&dynamic=true
//&grpc=1.0.0
//&side=consumer
//&interface=com.htsc.grpc.examples.helloworld.Greeter 另外附加
//&pid=8104  另外附加
//&timestamp=1497246256401 另外附加
//定义不定长数组用while循环变量
static grpc_conf_template_t consumer_confitem_consumers[] = {
	//application
	{ HTSC_GRPC_CONF_COMMON_APPLICATION,HTSC_GRPC_REGISTRY_KEY_APPLICATION,1,HTSC_GRPC_COMMON_BLANK },
	//category
	{ HTSC_GRPC_CONF_CONSUMER_CATEGORY,HTSC_GRPC_CATEGORY_KEY,1,HTSC_GRPC_CONSUMERS_CATEGORY },
	//check
	{ HTSC_GRPC_CONF_CONSUMER_CHECK,HTSC_GRPC_REGISTRY_KEY_CHECK,1,HTSC_GRPC_CONF_CONSUMER_CHECK_DEFAULT },
	//&default.cluster
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_CLUSTER,HTSC_GRPC_REGISTRY_KEY_DEFAULT_CLUSTER,1,HTSC_GRPC_CONF_CONSUMER_DEFAULT_CLUSTER_DEFAULT },
	//&default.connections
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_CONNECTIONS,HTSC_GRPC_REGISTRY_KEY_DEFAULT_CONNECTIONS,1,HTSC_GRPC_CONF_CONSUMER_DEFAULT_CONNECTIONS_DEFAULT },
	//&default.loadbalance=round_robin
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_LOADBALANCE,HTSC_GRPC_REGISTRY_KEY_DEFAULT_LOADBALANCE,1,HTSC_GRPC_CONF_CONSUMER_DEFAULT_LOADBALANCE_DEFAULT },
	//&default.requests   默认需要检查，设置为 10000？？？？ huyntodo 
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_REQUESTS,HTSC_GRPC_REGISTRY_KEY_DEFAULT_REQUESTS,1,HTSC_GRPC_CONF_CONSUMER_DEFAULT_REQUESTS_DEFAULT },
	//&default.retries=2
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_RETRIES,HTSC_GRPC_REGISTRY_KEY_DEFAULT_RETIES,0,HTSC_GRPC_CONF_CONSUMER_DEFAULT_RETRIES_DEFAULT },
	//&default.timeout=1000
	{ HTSC_GRPC_CONF_CONSUMER_DEFAULT_TIMEOUT,HTSC_GRPC_REGISTRY_KEY_DEFAULT_TIMEOUT,0,HTSC_GRPC_CONF_CONSUMER_DEFAULT_TIMEOUT_DEFAULT },
	//&grpc=1.0.0
	{ HTSC_GRPC_CONF_COMMON_GRPC,HTSC_GRPC_REGISTRY_KEY_VERSION,1,HTSC_GRPC_COMMON_BLANK },
	//&side=consumer
	{ HTSC_GRPC_CONF_CONSUMER_SIDE,HTSC_GRPC_REGISTRY_KEY_SIDE,1,HTSC_GRPC_CONF_CONSUMER_SIDE_DEFAULT },
	//&dynamic=true  （默认应该为 true）
	{ HTSC_GRPC_CONF_CONSUMER_DYNAMIC,HTSC_GRPC_REGISTRY_KEY_DYNAMIC,0,HTSC_GRPC_CONF_CONSUMER_DYNAMIC_DEFAULT }
};

// 组织consumer配置参数
int htsc_grpc_concate_consumer_str(char * urlparam) {
	return htsc_grpc_consumer_conf_param(urlparam, consumer_confitem_consumers, sizeof(consumer_confitem_consumers) / sizeof(consumer_confitem_consumers[0]));
}

//拼接url字符串。参数样例如下：
char *htsc_grpc_consumer_url(const char *service_name)
{
	//此处可以判断是否需要注册不需要注册的话ruturn "" 即可。

	size_t buf_size = sizeof(char) * HTSC_GRPC_URL_MAX_LEN;
	char buf[50] = {0};
	//拼接consumer注册url串
	char *result = (char*)malloc(buf_size);

	memset(result, 0, buf_size);

	strcat(result, HTSC_GRPC_CONSUMER_PROTOCOL);  //consumer
	strcat(result, HSTC_GRPC_URL_PROTOCOL_SUFFIX);
	strcat(result, get_local_ip());             //ipaddress
	strcat(result, HSTC_GRPC_URL_CHAR_XG); // 斜杠 /	
	strcat(result, service_name); //服务名称

								 //附加接口名称 infterface
	htsc_grpc_consumer_url_append(result, "?", HTSC_GRPC_REGISTRY_KEY_INTERFACE, service_name);

	//附加进程ID pid 
	sprintf(buf, "%d", grpc_getpid());
	htsc_grpc_consumer_url_append(result, "&", HTSC_GRPC_REGISTRY_KEY_PID, buf);

	memset(buf, 0, sizeof(buf));
#ifdef WIN64
	sprintf(buf, "%I64d", htsc_get_timestamp_in_mills());
#else
	sprintf(buf, "%lld", htsc_get_timestamp_in_mills());
#endif
	
	
	//附加时间戳 timestamp 
	htsc_grpc_consumer_url_append(result, "&", HTSC_GRPC_REGISTRY_KEY_TIMESTAMP, buf);

	//附加consumers其他附加参数
	htsc_grpc_concate_consumer_str(result);

	return result;
}


bool is_match_glob_pattern(std::string pattern, std::string value, url_t* param) {
	if (param != NULL && isStartWith(pattern.c_str(),"$"))
	{
		char *paramPtr = url_get_raw_parameter(param, pattern.substr(1).c_str());
		pattern = paramPtr;
		FREE_PTR(paramPtr);
	}
	return is_match_glob_pattern2(pattern, value);
}

bool is_match_glob_pattern2(std::string pattern, std::string value) {
	if (0 == strcmp("*",pattern.c_str()))
		return true;
	if ((pattern.length() == 0)
		&& (value.length() == 0))
		return true;
	if ((pattern.length() == 0)
		|| (value.length() == 0))
		return false;

	int i = pattern.find_last_of('*');
	// 没有找到星号
	if (i == -1) {
		return strcmp(pattern.c_str(),value.c_str()) == 0;
	}
	// 星号在末尾
	else if (i == pattern.length() - 1) {
		return  isStartWith(value.c_str(), pattern.substr(0, i).c_str());
	}
	// 星号的开头
	else if (i == 0) {
		return isEndsWith(value.c_str(), pattern.substr(i + 1).c_str());
	}
	// 星号的字符串的中间
	else {
		std::string prefix = pattern.substr(0, i);
		std::string suffix = pattern.substr(i + 1);
		return isStartWith(value.c_str(), prefix.c_str()) && isEndsWith(value.c_str(), suffix.c_str());
	}
}


bool is_provider_invalid(provider_t* provider) {
	if (HTSC_GRPC_CHECK_BIT(provider->flag, HTSC_GRPC_PROVIDER_FLAG_IN_BLKLIST) ||
		HTSC_GRPC_CHECK_BIT(provider->flag, HTSC_GRPC_PROVIDER_FLAG_CALL_FAIlOVER) ||
		HTSC_GRPC_CHECK_BIT(provider->flag, HTSC_GRPC_PROVIDER_FLAG_NOT_ACCESSED_BY_OLD_CLIENT))
	{
		return true;
	}
	//addbyhuyn 校验服务是否已过时（更新）
	consumer_check_provider_deprecated(provider->sInterface, provider->deprecated);
	return false;
}